/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package tp1.controllers;

import com.itextpdf.text.DocumentException;
import java.io.FileNotFoundException;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import tp1.dao.ClienteDao;
import tp1.dao.LinhaDao;
import tp1.models.Cliente;
import tp1.models.Linha;
import tp1.relatorio.RelatorioLinhas;
import tp1.views.ClientePanel;

/**
 *
 * @author tulio
 */
public class ClienteController extends Controller {

    protected static ClienteController instance = null;

    protected ClienteController(JPanel view) {
        super(view);
    }
    
    public static ClienteController getInstance(int controller, JPanel view){
        if(instance == null) {
            instance = new ClienteController(view);
        }
        return instance;
    }

    @Override
    public void action(int event) {
        switch(event){
            case Controller.EVENTO_ABRIR_TELA_CLIENTE:
                abrirAction();
                break;
            case Controller.EVENTO_SALVAR_CLIENTE:
                salvarAction();
                break;
            case Controller.EVENTO_APAGAR_CLIENTE:
                apagarAction();
                break;
            case Controller.EVENTO_NOVO_CLIENTE:
                novoAction();
                break;
            case Controller.EVENTO_EDITAR_CLIENTE:
                editarAction();
                break;
            case Controller.EVENTO_BUSCAR_CLIENTE:
                buscarAction();
                break;
            case Controller.EVENTO_RELATORIO_CLIENTE:
                relatorioAction();
                break;
        }
    }

    public void salvarAction(){
        ClientePanel clientePanel = (ClientePanel) this.view;

        Cliente cliente = new Cliente(clientePanel.getFieldCpf().getText().replace("-", "").replace(".", ""));
        cliente.setNome(clientePanel.getFieldNome().getText());
        cliente.setEndereco(clientePanel.getFieldEndereco().getText());
        
        try {
            if(ClienteDao.save(cliente) == 1){
                clientePanel.updateGridData();
                clientePanel.reloadDefaults();
                JOptionPane.showMessageDialog(clientePanel, "Registro salvo com sucesso.");
            } else {
                JOptionPane.showMessageDialog(clientePanel, "Nenhum registro salvo. CPF inválido.");
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(clientePanel, ex.getMessage(), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
    }

    public void apagarAction(){
        ClientePanel clientePanel = (ClientePanel) this.view;
        try {
            int row = clientePanel.getGridCliente().getSelectedRow();
            Object cpf = clientePanel.getGridCliente().getModel().getValueAt(row, 0);
            if(ClienteDao.delete(cpf.toString()) == 1){                
                clientePanel.updateGridData();
                JOptionPane.showMessageDialog(clientePanel, "Registro apagado com sucesso.");
            } else {
                JOptionPane.showMessageDialog(clientePanel, "Nenhum registro apagado. CPF inválido.");
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(clientePanel, ex.getMessage(), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
    }

    public void novoAction(){
        ClientePanel clientePanel = (ClientePanel) this.view;
        
        clientePanel.getFieldCpf().setText("");
        clientePanel.getFieldCpf().setEditable(true);
        clientePanel.getFieldEndereco().setText("");
        clientePanel.getFieldNome().setText("");

        clientePanel.getTabs().setSelectedIndex(1);
    }
    
    public void editarAction(){
        ClientePanel clientePanel = (ClientePanel) this.view;

        if(clientePanel.getGridCliente().getSelectedRow() != -1){
            clientePanel.getTabs().setSelectedIndex(1);
        } else {
            JOptionPane.showMessageDialog(clientePanel, "Nenhum linha selecionada. Para editar, primeiro selecione uma linha.");
        }
    }

    public void buscarAction(){
        ClientePanel clientePanel = (ClientePanel) this.view;
        String value = JOptionPane.showInputDialog(clientePanel, "Qual é o CPF do cliente que deseja localizar?", "Busca", JOptionPane.QUESTION_MESSAGE);
        Object[][] data;
        try {
            data = ClienteDao.findAsVector(value);
            clientePanel.setGridData(data);
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(clientePanel, ex.getMessage());
        }
    }
    
    public void relatorioAction(){
        ClientePanel clientePanel = (ClientePanel) this.view;
        int row = clientePanel.getGridCliente().getSelectedRow();
        String cpf = clientePanel.getGridCliente().getModel().getValueAt(row, 0).toString();
        
        try {
            ArrayList<Linha> linhas = LinhaDao.findByCpf(cpf);
            if(linhas.isEmpty()){
                throw new Exception("Dados de linhas para este cliente não foram encontrados.");
            }

            RelatorioLinhas r = new RelatorioLinhas();
            r.setLinhas(linhas);
            r.setNome(linhas.get(0).getCliente().getCpf());
            r.setTitulo("Relatório de linhas telefônicas - " + cpf);
            r.criar();
        } catch (DocumentException de) {
            JOptionPane.showMessageDialog(clientePanel, de.getMessage());
        } catch (FileNotFoundException fe) {
            JOptionPane.showMessageDialog(clientePanel, fe.getMessage());
        } catch (SQLException se) {
            JOptionPane.showMessageDialog(clientePanel, se.getMessage());
        } catch (Exception e) {
            JOptionPane.showMessageDialog(clientePanel, e.getMessage());
        }
    }

}
